# 2.	Web应用的搭建功能性约束
# 1)	用户交互：
# 提供一个简单的用户界面，允许用户上传图片。
# 在用户上传图片后，显示预测结果。
import numpy as np
from flask import Flask,request,render_template

app = Flask(__name__,template_folder='html')

# 2)	图片处理：
# 接收用户上传的图片文件。
# 将图片保存到服务器上的指定目录。
# 读取图片文件，并将其转换为模型可以处理的格式。
from keras.preprocessing.image import load_img,img_to_array

def read_img(path):
    img = load_img(path,target_size=(32,32),grayscale=False)
    img = img_to_array(img)
    img = img.reshape(-1,32,32,3) / 255
    return img
# 3)	模型预测：
# 加载预先训练好的深度学习模型。
# 使用模型对处理后的图片进行预测。
# 将预测结果转换为人类可读的格式。
import zk1

model = zk1.AlexNet()
model.build(input_shape=(None,32,32,3))
model.summary()
# 4)	结果展示：
# 将预测结果展示给用户，包括预测的类别和上传的图片。
# 5)	错误处理：
# 如果上传的文件不是图片，或者文件读取出现问题，需要给用户一个明确的错误提示。
# 6)	服务器配置：
# 配置Flask应用以在指定的主机和端口上运行。
# 开启调试模式以便于开发过程中的错误追踪。
# 7)	安全性：
# 确保上传的文件被保存在安全的目录下，并且只能通过Web应用访问。
# 防止恶意文件上传和执行。
# 8)	可扩展性：
# 代码结构应该清晰，以便于未来添加更多的功能或修改现有的功能。
# 9)	性能：
# 确保应用能够处理多个并发请求。
# 优化图片处理和模型预测的速度。
@app.route('/')
def hello():
    return render_template('home.html')

@app.route('/predict', methods=['GET', 'POST'])
def predict():
    try:
        if request.method == 'POST':
            file = request.files['file']
            if file:
                file_name = file.filename
                path = f'static/img/{file_name}'
                file.save(path)
                img = read_img(path)
                predict = model.predict(img)
                label = np.argmax(predict)
                cifar10_labels = {
                    0: 'airplane（飞机）',
                    1: 'automobile（汽车）',
                    2: 'bird（鸟）',
                    3: 'cat（猫）',
                    4: 'deer（鹿）',
                    5: 'dog（狗）',
                    6: 'frog（青蛙）',
                    7: 'horse（马）',
                    8: 'ship（船）',
                    9: 'truck（卡车）'}
            return render_template('predict.html',user_image=path,product=cifar10_labels[label])
        else:
            return render_template('predict.html')
    except Exception:
        return str(Exception)
# 10)	兼容性：
# 确保应用在不同的浏览器和操作系统上都能正常工作。
if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0',port=6008)